#ifndef __COMMON__H__
#define __COMMON__H__

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include "log.hpp"

using namespace std;
const string PATH = "/home/lyf";
const int PROID = 0x1234;
// 共享内存的大小建议是4096的整数倍
// 当我们将SIZE改为4097时,OS实际给我们的是4096*2的大小, 但多出来的那4095byte我们并不能使用
// 这就造成了浪费
const int SIZE = 4096;
Log log;

key_t GetKey()
{
    key_t k = ftok(PATH.c_str(), PROID);
    if(k == -1) {
        log(FATAL, "ftok error, %s", strerror(errno));
        exit(1);
    }
    log(INFO, "Creat key sucess, key is 0x%x", k);
    return k;
}

int ShareMemHelper(int flag)
{
    int shmid = shmget(GetKey(), SIZE, flag);
    if(shmid == -1) {
        log(FATAL, "shmid error, %s", strerror(errno));
        exit(2);
    }
    log(INFO, "Creat or Get shmid sucess, shmid is %d", shmid);
    return shmid;
}

// 创建共享内存
int CreatShareMem()
{
    return ShareMemHelper(IPC_CREAT | IPC_EXCL | 0666);
}

// 获取共享内存的shimid
int GetShareMem()
{
    return ShareMemHelper(IPC_CREAT);
}

#define FIFO_FILE "./myfifo"
#define MODE 0666

const int N = 1024;

enum {
    FIFO_CREAT_ERR = 1,
    FIFO_DEL_ERR,
    FIFO_OPEN_ERR,
    FIFO_READ_ERR
};

// 用于处理server.cc部分代码的初始化和析构处理
struct Init
{
    Init()
    {
        // 创建信道
        int n = mkfifo(FIFO_FILE, MODE);
        if (n == -1) {
            perror("mkfifo");
            exit(FIFO_CREAT_ERR);
        }
    }
    ~Init()
    {
        // 删除信道
        int m = unlink(FIFO_FILE);
        if (m == -1) {
            perror("unlink");
            exit(FIFO_DEL_ERR);
        }
    }
};
#endif